/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.reportes;

import com.camachosanchez.bean.Despinches;
import com.camachosanchez.bean.DetalleDespinche;
import com.camachosanchez.bean.Neumaticos;
import com.camachosanchez.util.GUIUtil;
import com.camachosanchez.util.JPAUtil;
import com.camachosanchez.util.ReportUtil;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.swing.JOptionPane;

/**
 *
 * @author ZULLY
 */
public class ReporteDespinches {

    private EntityManagerFactory emf;
    private EntityManager em;

    public ReporteDespinches() {
        emf = JPAUtil.getEntityManagerFactory();
        em = emf.createEntityManager();
    }

    public void generarReporte(Neumaticos neumatico, Date desde, Date hasta) {
        Document document = new Document(PageSize.A4, 0, 0, 50, 50);
        try {
            SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
            String nombrePdf = "reportes/neumatico_" + ((neumatico != null) ? neumatico.getCodigo() : "") + ".pdf";
            PdfWriter.getInstance(document, new FileOutputStream(nombrePdf));
            document.open();
            String titulo = (neumatico != null) ? "Reporte de despinches - Neumático: " + neumatico.getCodigo() : "Reporte de despinches -  Todos los neumáticos";
            document.addTitle(titulo);

//            float[] anchoColsT = {1.1f, 0.6f};//version prueba
            PdfPTable tablaTitulo = new PdfPTable(1);
            tablaTitulo.setSpacingAfter(10f);
            tablaTitulo.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaTitulo.setWidthPercentage(100);

            PdfPCell celda = new PdfPCell(new Phrase(titulo + " " + formatoDeFecha.format(desde) + " - " + formatoDeFecha.format(hasta),
                    FontFactory.getFont(BaseFont.HELVETICA, 12, Font.NORMAL, BaseColor.BLACK)));
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
            celda.setBorderWidth(0);
            tablaTitulo.addCell(celda);

//            tablaTitulo.addCell(ReportUtil.getCelda("TireSoft 2.0 (Versión de prueba)",1,1,BaseColor.WHITE,0,0,10,1));//version prueba
            document.add(tablaTitulo);

            float[] anchoColsN = {4f, 1f, 1.5f, 2f, 2f};
            PdfPTable tablaN = new PdfPTable(anchoColsN);
            tablaN.setSpacingAfter(10f);
            tablaN.setWidthPercentage(90);

            double totalGeneral = 0;
            List<Despinches> datos = getDatos(neumatico, desde, hasta);
            for (Despinches despinche : datos) {
                PdfPTable tablaH = new PdfPTable(7);
                tablaN.setWidthPercentage(90);
                tablaH.addCell(ReportUtil.getCelda("CÓDIGO: ", 1, 1, BaseColor.WHITE, 0, 0.5f, 9, 1));
                tablaH.addCell(ReportUtil.getCelda(despinche.getIdNeumaticos().getCodigo(), 6, 1, BaseColor.WHITE, 0, 0.5f, 9, 1));
                tablaH.addCell(ReportUtil.getCelda("FECHA:", 1, 1, BaseColor.WHITE, 0, 0.5f, 9, 1));
                tablaH.addCell(ReportUtil.getCelda(formatoDeFecha.format(despinche.getFecha()), 6, 1, BaseColor.WHITE, 0, 0.5f, 9, 0));
                tablaH.addCell(ReportUtil.getCelda("KM:", 1, 1, BaseColor.WHITE, 0, 0.5f, 9, 1));
                tablaH.addCell(ReportUtil.getCelda("" + despinche.getKmVehiculo(), 6, 1, BaseColor.WHITE, 0, 0.5f, 9, 0));
                PdfPCell celdaH = new PdfPCell(tablaH);
                celdaH.setColspan(5);
                tablaN.addCell(celdaH);
                tablaN.addCell(ReportUtil.getCelda("INSUMO", 1, 1, BaseColor.GRAY.brighter(), 1, 0.5f, 10, 1));
                tablaN.addCell(ReportUtil.getCelda("CÓDIGO", 1, 1, BaseColor.GRAY.brighter(), 1, 0.5f, 10, 1));
                tablaN.addCell(ReportUtil.getCelda("CANTIDAD", 1, 1, BaseColor.GRAY.brighter(), 1, 0.5f, 9, 1));
                tablaN.addCell(ReportUtil.getCelda("COSTO UNITARIO", 1, 1, BaseColor.GRAY.brighter(), 1, 0.5f, 9, 1));
                tablaN.addCell(ReportUtil.getCelda("COSTO TOTAL", 1, 1, BaseColor.GRAY.brighter(), 1, 0.5f, 9, 1));

                List<DetalleDespinche> detalle = despinche.getDetalleDespincheList();
                double total = 0;
                for (DetalleDespinche item : detalle) {
                    tablaN.addCell(ReportUtil.getCelda(item.getIdInsumosDespinche().getNombre(), 1, 1, new BaseColor(255, 255, 255), 0, 0.5f, 9, 0));
                    tablaN.addCell(ReportUtil.getCelda(item.getIdInsumosDespinche().getCodigo() + "", 1, 1, new BaseColor(255, 255, 255), 1, 0.5f, 9, 0));
                    tablaN.addCell(ReportUtil.getCelda(item.getCantidad() + "", 1, 1, new BaseColor(255, 255, 255), 1, 0.5f, 9, 0));
                    tablaN.addCell(ReportUtil.getCelda(GUIUtil.formatearNumero(item.getCostoUnitario()) + "", 1, 1, new BaseColor(255, 255, 255), 2, 0.5f, 9, 0));
                    tablaN.addCell(ReportUtil.getCelda(GUIUtil.formatearNumero(item.getCostoTotal()) + "", 1, 1, new BaseColor(255, 255, 255), 2, 0.5f, 9, 0));
                    total += item.getCostoTotal();
                }
                totalGeneral += total;
                tablaN.addCell(ReportUtil.getCelda("SUBTOTAL:", 4, 1, BaseColor.WHITE, 2, 0.5f, 9, 1));
                tablaN.addCell(ReportUtil.getCelda(GUIUtil.formatearNumero(total) + "", 1, 1, BaseColor.WHITE, 2, 0.5f, 9, 1));
                tablaN.addCell(ReportUtil.getCelda(" ", 5, 1, BaseColor.WHITE, 0, 0f, 9, 1));
            }
            tablaN.addCell(ReportUtil.getCelda("TOTAL:", 4, 1, BaseColor.WHITE, 2, 0.5f, 9, 1));
            tablaN.addCell(ReportUtil.getCelda(GUIUtil.formatearNumero(totalGeneral) + "", 1, 1, BaseColor.WHITE, 2, 0.5f, 9, 1));
            document.add(tablaN);

            document.close();

            File pdfFile = new File(nombrePdf);
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(pdfFile);
            } else {
                JOptionPane.showMessageDialog(null, "No se puede obtener la vista previa.", "Error al abrir el archivo", JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    private List<Despinches> getDatos(Neumaticos neumatico, Date fechaIni, Date fechaFin) {
        java.sql.Date sqlFechaIni = new java.sql.Date(fechaIni.getTime());
        java.sql.Date sqlFechaFin = new java.sql.Date(fechaFin.getTime());
        Query q1 = em.createQuery("SELECT D FROM Despinches D "
                + "WHERE D.fecha <= :fechaFin AND D.fecha >= :fechaIni "
                + ((neumatico == null) ? "" : "AND D.idNeumaticos.id = :idNeumtico ")
                + "ORDER BY D.idNeumaticos.codigo, D.fecha");
        q1.setParameter("fechaIni", sqlFechaIni);
        q1.setParameter("fechaFin", sqlFechaFin);
        if (neumatico != null) {
            q1.setParameter("idNeumtico", neumatico.getId());
        }
        return q1.getResultList();
    }
}
